﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Security.Cryptography;
using LogicaDeNegocio;
using Entidades;

namespace AdministradorForm
{
    public partial class LoginForm : Form
    {
        private const int NumeroIntentos = 3;
        private int veces = 0;

        public LoginForm()
        {
            InitializeComponent();
        }

        private void LoginForm_Load(object sender, EventArgs e)
        {
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (textBox3.Text.Length == 0)
                MessageBox.Show("Debe ingresar su usuario para continuar", "Error en login", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            else if (textBox4.Text.Length == 0)
                MessageBox.Show("Debe ingresar su contraseña para continuar", "Error en login", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
            else
            {
                // Convertir a SHA1 la clave introducida
                string claveSHA1 = GenerarClaveSHA1(textBox4.Text);
                ServiceReferenceAdmin.Service1SoapClient srv = new AdministradorForm.ServiceReferenceAdmin.Service1SoapClient();
                IAsyncResult res = srv.BeginValidarUsuario(int.Parse(textBox3.Text), claveSHA1, new AsyncCallback(ResultButton2), srv);
            }
        }

        private void ResultButton2(IAsyncResult res)
        {
            this.Invoke(new AsyncCallback(ActualizarPantalla), new object[] { res });
        }

        private void ActualizarPantalla(IAsyncResult res)
        {
            ServiceReferenceAdmin.Service1SoapClient srv = (ServiceReferenceAdmin.Service1SoapClient)res.AsyncState;
            if (srv.EndValidarUsuario(res))
            {
                this.DialogResult = DialogResult.OK;
            }
            else
            {
                // Permitir tres intentos
                veces = veces + 1;
                if (veces < NumeroIntentos - 1)
                {
                    label2.Text = "Quedan " + (NumeroIntentos - veces) + " intentos";
                    return;
                }
                else if (veces == NumeroIntentos - 1)
                {
                    label2.Text = "Le resta un intento para loguearse, si éste es incorrecto el programa se cerrará";
                    return;
                   
                }
                else if (veces == NumeroIntentos)
                    Close();
                this.DialogResult = DialogResult.No;
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            textBox3.Text = "";
            textBox4.Text = "";
            Close();
        }

        private void textBox3_Validating(object sender, CancelEventArgs e)
        {
            if (textBox3.Text.Length == 0)
                errorProvider1.SetError(textBox3, "Debe ingresar su usuario");
            else errorProvider1.Clear();
        }

        private void textBox4_Validating(object sender, CancelEventArgs e)
        {
            if (textBox4.Text.Length == 0)
                errorProvider1.SetError(textBox4, "Debe ingresar su contraseña");
            else errorProvider1.Clear();
        }

        private string GenerarClaveSHA1(string nombre)
        {
            // Crear una clave SHA1
            UTF8Encoding enc = new UTF8Encoding();
            byte[] data = enc.GetBytes(nombre);
            byte[] result;

            SHA1CryptoServiceProvider sha = new SHA1CryptoServiceProvider();
            result = sha.ComputeHash(data);
            // Convertir los valores en hexadecimal
            // cuando tiene una cifra hay que rellenarlo con cero
            // para que siempre ocupe dos dígitos.
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < result.Length; i++)
            {
                if (result[i] < 16)
                {
                    sb.Append("0");
                }
                sb.Append(result[i].ToString("x"));
            }
            return sb.ToString();
        }  
    }
}
